package com.zuipin.util;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;

/**
 * @author cjj
 * @date 2014年12月25日
 * @TODO 类型转换工具
 * 1.常用类型转换 String,Integer,Long,Short,Double
 * 2.中文转拼音
 * 3.map与object类型互转
 * 4.不同对象间的同名属性复制
 * 5.数组与字符串单的还互转
 */
@SuppressWarnings("rawtypes")
public class Convert {
	
	/**
	 * @功能描述：类型转化 String
	 * @作者 : cjj
	 * @创建时间 : 2017年3月30日上午11:12:38
	 * @param object
	 * @return
	*/
	public static String toString(Object object) {
		if (object != null) {
			return String.valueOf(object);
		} else {
			return "";
		}
	}
	
	/**
	 * @功能描述：转化成Long
	 * @作者 : cjj 
	 * @创建时间 : 2017年3月30日上午11:12:18
	 * @param object
	 * @return
	*/
	public static Long toLong(Object object) {
		try {
			if (object != null) {
				return Long.valueOf(String.valueOf(object));
			} else {
				return 0l;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * @功能描述：转化成Integer
	 * @作者 : cjj 
	 * @创建时间 : 2017年3月30日上午11:12:03
	 * @param object
	 * @return
	*/
	public static Integer toInteger(Object object) {
		try {
			if (object != null) {
				return Integer.valueOf(String.valueOf(object));
			} else {
				return 0;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * @功能描述：转化成short
	 * @作者 : cjj 陈俊杰
	 * @创建时间 : 2016年3月8日下午9:26:58
	 * @return
	 */
	public static Short toShort(Object object) {
		try {
			if (object != null) {
				String str = String.valueOf(object);
				if (StringUtil.isNotBlank(str)) {
					return Short.valueOf(str);
				} else {
					return null;
				}
			} else {
				return 0;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * @功能描述：类型转换成Double
	 * @作者 : cjj 
	 * @创建时间 : 2017年3月30日上午11:13:29
	 * @param object
	 * @return
	*/
	public static Double toDouble(Object object) {
		try {
			if (object != null && !"".equals(String.valueOf(object).trim())) {
				return Double.valueOf(String.valueOf(object));
			} else {
				return 0d;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public static Object toObject(String value, Class<?> toType) {
		try {
			return org.apache.commons.beanutils.ConvertUtils.convert(value, toType);
		} catch (Exception e) {
			throw e;
		}
	}
	
	/**
	 * @功能描述：object 同名属性copy
	 * @作者 : cjj 
	 * @创建时间 : 2017年3月30日上午11:44:54
	 * @param entityType
	 * @param vo
	 * @return
	 * @throws IntrospectionException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws InvocationTargetException
	*/
	public static Object beanToBean(Class entityType, Object vo) throws IntrospectionException,
			IllegalAccessException, InstantiationException, InvocationTargetException {
		Map map = beanToMap(vo);
		Object entity = mapToBean(entityType, map);
		return entity;
	}
	
	/**
	 * 将一个 Map 对象转化为一个 JavaBean
	 * 
	 * @param type 要转化的类型
	 * @param map 包含属性值的 map
	 * @return 转化出来的 JavaBean 对象
	 * @throws IntrospectionException 如果分析类属性失败
	 * @throws IllegalAccessException 如果实例化 JavaBean 失败
	 * @throws InstantiationException  如果实例化 JavaBean 失败
	 * @throws InvocationTargetException 如果调用属性的 setter 方法失败
	 */
	public static Object mapToBean(Class type, Map map) throws IntrospectionException,
			IllegalAccessException, InstantiationException, InvocationTargetException {
		BeanInfo beanInfo = Introspector.getBeanInfo(type); // 获取类属性
		Object obj = type.newInstance(); // 创建 JavaBean 对象
		
		// 给 JavaBean 对象的属性赋值
		PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
		for (int i = 0; i < propertyDescriptors.length; i++) {
			PropertyDescriptor descriptor = propertyDescriptors[i];
			String propertyName = descriptor.getName();
			
			if (map.containsKey(propertyName)) {
				// 下面一句可以 try 起来，这样当一个属性赋值失败的时候就不会影响其他属性赋值。
				Object value = map.get(propertyName);
				
				Object[] args = new Object[1];
				args[0] = value;
				
				descriptor.getWriteMethod().invoke(obj, args);
			}
		}
		return obj;
	}
	
	/**
	 * 将一个 JavaBean 对象转化为一个 Map
	 * @param bean 要转化的JavaBean 对象
	 * @return 转化出来的 Map 对象
	 * @throws IntrospectionException 如果分析类属性失败
	 * @throws IllegalAccessException 如果实例化 JavaBean 失败
	 * @throws InvocationTargetException 如果调用属性的 setter 方法失败
	 */
	
	public static Map beanToMap(Object bean) throws IntrospectionException, IllegalAccessException,
			InvocationTargetException {
		Class type = bean.getClass();
		Map returnMap = new HashMap();
		BeanInfo beanInfo = Introspector.getBeanInfo(type);
		
		PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
		for (int i = 0; i < propertyDescriptors.length; i++) {
			PropertyDescriptor descriptor = propertyDescriptors[i];
			String propertyName = descriptor.getName();
			if (!propertyName.equals("class")) {
				Method readMethod = descriptor.getReadMethod();
				Object result = readMethod.invoke(bean, new Object[0]);
				if (result != null) {
					returnMap.put(propertyName, result);
				} else {
					returnMap.put(propertyName, "");
				}
			}
		}
		return returnMap;
	}
	
	/**
	 * 功能描述：将Object类型的Map对象 转换成String类型的Map对象
	 * 
	 * @author : cjj 陈俊杰 @CreatedTime : 2014年12月26日上午11:32:06
	 * @param map
	 * @return
	 */
	public static Map<String, String> ChangeMapType(Map<?, ?> map) {
		Map<String, String> kvmap = new HashMap<String, String>();
		for (Object obj : map.keySet()) {
			String key = String.valueOf(obj);
			String value = String.valueOf(map.get(obj));
			kvmap.put(key, value);
		}
		return kvmap;
	}
	
	// 拼音输出格式对象
	private static HanyuPinyinOutputFormat	outputFormat	= new HanyuPinyinOutputFormat();
	
	// 默认设置声调格式为无声调
	private static HanyuPinyinToneType		toneType		= HanyuPinyinToneType.WITHOUT_TONE;
	
	// 默认设置特殊拼音ü的显示格式为v
	private static HanyuPinyinVCharType		vcharType		= HanyuPinyinVCharType.WITH_V;
	
	// 默认设置大小写格式为小写
	private static HanyuPinyinCaseType		caseType		= HanyuPinyinCaseType.LOWERCASE;
	
	/**
	 * 中文转全拼音
	 */
	private static String toPinyin(String str) {
		if (str == null) {
			return "";
		}
		if (str.trim().length() < 1) {
			return str;
		}
		char[] ccs = str.toCharArray();
		StringBuffer con = new StringBuffer();
		outputFormat.setToneType(toneType);
		outputFormat.setVCharType(vcharType);
		outputFormat.setCaseType(caseType);
		for (char c : ccs) {
			try {
				// 如果输入的参数不是汉字，则返回null
				String[] ss = PinyinHelper.toHanyuPinyinStringArray(c, outputFormat);
				if (ss == null) {
					con.append(c);
				} else {
					con.append(ss[0]);
				}
			} catch (Exception e) {
				con.append(c);
			}
		}
		return con.toString();
	}
	
	/**
	 * 中文转拼音母
	 */
	private static String toFirstPinyin(String str) {
		if (str == null) {
			return "";
		}
		if (str.trim().length() < 1) {
			return str;
		}
		char[] ccs = str.toCharArray();
		StringBuffer con = new StringBuffer();
		outputFormat.setToneType(toneType);
		outputFormat.setVCharType(vcharType);
		outputFormat.setCaseType(caseType);
		for (char c : ccs) {
			try {
				// 如果输入的参数不是汉字，则返回null
				String[] ss = PinyinHelper.toHanyuPinyinStringArray(c, outputFormat);
				if (ss == null) {
					con.append(c);
				} else {
					con.append(ss[0].substring(0, 1));
				}
			} catch (Exception e) {
				con.append(c);
			}
		}
		return con.toString();
	}
	
	/**
	 * 中文转全拼音..小写
	 */
	public static String toLowerCasePinyin(String str) {
		return toPinyin(str);
	}
	
	/**
	 * 中文转全拼音..大写
	 */
	public static String toUpperCasePinyin(String str) {
		caseType = HanyuPinyinCaseType.UPPERCASE;
		return toPinyin(str);
	}
	
	/**
	 * 中文转拼音母..小写
	 */
	public static String toLowerCaseFirstPinyin(String str) {
		return toFirstPinyin(str);
	}
	
	/**
	 * 中文转拼音母..大写
	 */
	public static String toUpperCaseFirstPinyin(String str) {
		caseType = HanyuPinyinCaseType.UPPERCASE;
		return toFirstPinyin(str);
	}
	
	/**
	 * @功能描述：字符串数组转换为字符
	 * @作者 : cjj 
	 * @创建时间 : 2017年3月30日下午2:57:52
	 * @param arr
	 * @return
	*/
	public static String arrayToString(String[] arr) {
		StringBuffer buffer = new StringBuffer();
		for (int i = 0; i < arr.length; i++) {
			if (i > 0) {
				buffer.append(",");
			}
			buffer.append(arr[i]);
		}
		return buffer.toString();
	}
}
